{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "3a51f9dd",
   "metadata": {},
   "outputs": [],
   "source": [
    "from transformers import AutoTokenizer\n",
    "\n",
    "tokenizer = AutoTokenizer.from_pretrained('unsloth/Llama-3.2-3B-Instruct')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "7853d213",
   "metadata": {},
   "outputs": [],
   "source": [
    "from streaming import MDSWriter\n",
    "from streaming.base.format.mds.encodings import Encoding, _encodings\n",
    "from streaming import LocalDataset\n",
    "import streaming\n",
    "import numpy as np\n",
    "from tqdm import tqdm\n",
    "from glob import glob\n",
    "import os\n",
    "import json\n",
    "\n",
    "class UInt32(Encoding):\n",
    "    def encode(self, obj) -> bytes:\n",
    "        return obj.tobytes()\n",
    "\n",
    "    def decode(self, data: bytes):\n",
    "        return np.frombuffer(data, np.uint32)\n",
    "\n",
    "_encodings['uint32'] = UInt32\n",
    "\n",
    "columns = {\n",
    "    'input_ids': 'uint32',\n",
    "    'position_ids': 'uint32',\n",
    "    'attention_mask': 'uint32',\n",
    "}\n",
    "hashes = 'sha1', 'xxh64'"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "1c9d5a3d",
   "metadata": {},
   "outputs": [],
   "source": [
    "!rm -rf tokenized-4k\n",
    "!mkdir tokenized-4k"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "80fff1c4",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1900"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "combine = []\n",
    "with open('combined-malaysian-sft-50-sample-all.jsonl') as fopen:\n",
    "    for l in fopen:\n",
    "        l = json.loads(l)\n",
    "        combine.append(l)\n",
    "\n",
    "len(combine)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "c88624ad",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "41655"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "with open('combined-malaysian-reasoning.jsonl') as fopen:\n",
    "    for l in fopen:\n",
    "        l = json.loads(l)\n",
    "        combine.append(l)\n",
    "        \n",
    "len(combine)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "e7cfa079",
   "metadata": {},
   "outputs": [],
   "source": [
    "import gc\n",
    "\n",
    "def collator(batch, batch_position_ids):\n",
    "    input_ids = []\n",
    "    position_ids = []\n",
    "    masks = []\n",
    "    for i in range(len(batch)):\n",
    "        l = len(batch[i])\n",
    "        input_ids.extend(batch[i])\n",
    "        position_ids.extend(batch_position_ids[i])\n",
    "        masks.append(l)\n",
    "    \n",
    "    return {\n",
    "        'input_ids': np.array(input_ids).astype(np.uint32),\n",
    "        'position_ids': np.array(position_ids).astype(np.uint32),\n",
    "        'attention_mask': np.array(masks).astype(np.uint32),\n",
    "    }\n",
    "\n",
    "def slice_and_balance(nested_list, size):\n",
    "    first = []\n",
    "    balance = []\n",
    "    current_size = 0\n",
    "\n",
    "    for sublist in nested_list:\n",
    "        if current_size < size:\n",
    "            remaining_space = size - current_size\n",
    "            if len(sublist) <= remaining_space:\n",
    "                first.append(sublist)\n",
    "                current_size += len(sublist)\n",
    "            else:\n",
    "                first.append(sublist[:remaining_space])\n",
    "                balance.append(sublist[remaining_space:])\n",
    "                current_size = size\n",
    "        else:\n",
    "            balance.append(sublist)\n",
    "    \n",
    "    return first, balance"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "ade760e2",
   "metadata": {},
   "outputs": [],
   "source": [
    "import time\n",
    "\n",
    "def loop(files, block_size = 3072):\n",
    "    rows, index = files\n",
    "    out_root = f'tokenized-4k/tokenized-{index}'\n",
    "    os.system(f'rm -rf {out_root}')\n",
    "    count = 0\n",
    "    temp = []\n",
    "    position_ids = []\n",
    "    last_block, last_position_block = None, None\n",
    "    with MDSWriter(out=out_root, columns=columns, compression=None, hashes=hashes) as out:\n",
    "        for row in tqdm(rows):\n",
    "            prompt = tokenizer.apply_chat_template(row, tokenize=False)\n",
    "            outputs = tokenizer(prompt, add_special_tokens = False)\n",
    "            temp.append(outputs['input_ids'])\n",
    "            position_ids.append(range(len(outputs['input_ids'])))\n",
    "            count += len(outputs['input_ids'])\n",
    "            while count >= block_size:\n",
    "                block, temp = slice_and_balance(temp, block_size)\n",
    "                block_position, position_ids = slice_and_balance(position_ids, block_size)\n",
    "                count = count - block_size\n",
    "                o = collator(block, block_position)\n",
    "                last_block = block\n",
    "                last_position_block = block_position\n",
    "                out.write(o)\n",
    "                \n",
    "        block, _ = slice_and_balance(last_block, block_size - count)\n",
    "        block_position, _ = slice_and_balance(last_position_block, block_size - count)\n",
    "\n",
    "        block.extend(temp)\n",
    "        block_position.extend(position_ids)\n",
    "\n",
    "        o = collator(block, block_position)\n",
    "        if len(o['input_ids']) == block_size:\n",
    "            out.write(o)\n",
    "            return o"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "3d869083",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|██████████████████████████████████████████████████████████████████████████████████| 41655/41655 [04:10<00:00, 166.33it/s]\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "{'input_ids': array([109067,  32173,  53804, ...,    268,     13, 128009], dtype=uint32),\n",
       " 'position_ids': array([ 995,  996,  997, ..., 2004, 2005, 2006], dtype=uint32),\n",
       " 'attention_mask': array([1752,  633,  687], dtype=uint32)}"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "loop((combine, 0))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "74d10275",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['tokenized-4k/tokenized-0']"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "folders = sorted(glob('tokenized-4k/tokenized-*'), key = lambda x: int(x.split('-')[-1]))\n",
    "folders"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "85e34dd1",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...\n",
      "To disable this warning, you can either:\n",
      "\t- Avoid using `tokenizers` before the fork if possible\n",
      "\t- Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)\n"
     ]
    }
   ],
   "source": [
    "!rm -rf packing-4k-reasoning"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "7ed8dea8",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|████████████████████████████████████████████████████████████████████████████████| 60163/60163 [00:03<00:00, 15877.00it/s]\n"
     ]
    }
   ],
   "source": [
    "with MDSWriter(out='packing-4k-reasoning', columns=columns, compression=None, hashes=hashes) as out:\n",
    "    for f in folders:\n",
    "        try:\n",
    "            dataset = LocalDataset(local=f)\n",
    "            for i in tqdm(range(len(dataset))):\n",
    "                out.write(dataset[i])\n",
    "        except Exception as e:\n",
    "            print(e)\n",
    "            pass"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "c71cb7e9",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.184820736"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dataset = LocalDataset('packing-4k-reasoning')\n",
    "(len(dataset) * 3072) / 1e9"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "ed1b8c00",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'وسِكُمْ وَأَرْجُلَكُمْ إِلَى الْكَعْبَيْنِ\\n\\nMaksudnya: \"Wahai orang-orang yang beriman, apabila kamu hendak mengerjakan sembahyang (padahal kamu berhadas kecil), maka (berwuduklah) iaitu basuhlah muka kamu, dan kedua belah tangan kamu meliputi siku, dan sapulah sebahagian dari kepala kamu, dan basuhlah kedua belah kaki kamu meliputi buku lali.\"\\n\\nSurah Al-Maidah (6)\\n\\nBerbalik kepada soalan di atas, kami nyatakan hukum bagi air liur ada dua. Sekiranya air liur tersebut dari mulut maka hukumnya suci. Manakala, jika ia keluar dari perut maka hukumnya adalah najis. Justeru itu, sebaiknya jika terdapat air liur basi, maka basuhlah bagi mengelakkan was-was.\\n\\nPerbahasan berkenaan air liur basi dan najis boleh juga di link bawah:\\n\\n#36 Status Air Liur Basi[1]\\n\\n#849 Menyentuh Najis Membatalkan Wuduk[2]\\n\\nOleh itu, kami nyatakan solat saudara sah kerana sebelum solat juga saudara telah membersihkan diri seperti menggosok gigi, berwuduk dan sebagainya.\\n\\nKami tegaskan di sini bahawa air liur basi semata-mata tidaklah najis dan membatalkan wuduk. Begitu juga, solat saudara insyaAllah sah dan diterima oleh Allah SWT. Amin.\\n\\nSemoga Allah SWT memberikan kefahaman yang jelas kepada kita semua dalam beragama, serta kegigihan, kesungguhan dan kesabaran dalam menekuni ilmu, seterusnya menyebarkannya kepada segenap lapisan masyarakat.  Ameen.\\n\\n[1] https://maktabahalbakri.com/status-air-liur-basi/\\n\\n[2] https://maktabahalbakri.com/849-menyentuh-najis-membatalkan-wuduk/<|eot_id|><|begin_of_text|><|start_header_id|>system<|end_header_id|>\\n\\nCutting Knowledge Date: December 2023\\nToday Date: 06 Jan 2025\\n\\nYou are going to enter reasoning mode, first you try to think step-by-step in malay after that give the final answer.<|eot_id|><|start_header_id|>user<|end_header_id|>\\n\\nAssalamualaikum Dato’ Seri. Saya ada soalan. Baru-baru ini saya tersilap baca bacaan tasbih rukuk pada sujud dan bacaan tasbih sujud pada rukuk. Lepas solat baru perasan. Adakah solat saya masih sah atau saya perlu mengulanginya semula? Mohon pencerahan. Terima kasih.<|eot_id|><|start_header_id|>assistant<|end_header_id|>\\n\\nAlhamdulillah, segala puji bagi Allah SWT, selawat dan salam kepada Junjungan Besar Nabi Muhammad SAW, isteri dan ahli keluarga Baginda, para sahabat Baginda serta orang-orang yang mengikuti jejak langkah Baginda sehingga Hari Kiamat.\\n\\nPada asasnya kita hendaklah mendirikan solat sebagaimana yang diajarkan oleh Rasulullah SAW. Hal ini adalah sebagaimana riwayat daripada Malik bin al-Huwairith bahawa Rasulullah SAW bersabda:\\n\\nصَلُّوا كما رَأَيْتُمُونِي أُصَلِّي\\n\\nMaksudnya: \"Solatlah sepertimana kamu semua melihat aku solat.\"\\n\\nRiwayat al-Bukhari (6008) dan Muslim (674)\\n\\nSecara umumnya, ulama mazhab Syafi\\'i telah memasukkan bacaan tasbih ketika rukuk dan sujud sebagai sunat hai\\'ah. Sunat hai\\'ah ialah sunat-sunat solat yang sekiranya ditinggalkan tidak sunat digantikan dengan sujud sahwi. (Lihat al-Fiqh al-Manhaji, 1/147; al-Majmu\\' Syarh al-Muhazzab, 4/427).\\n\\nImam al-Nawawi menjelaskan lagi dengan menyebutkan, bacaan tasbih, seluruh zikir-zikir dalam rukuk dan sujud, ucapan \"سَمِعَ اللَّهُ لِمَنْ حَمِدَهُ وَرَبَّنَا لَكَ الْحَمْدُ\", dan bertakbir pada selain takbiratul ihram, semua perkara tersebut adalah sunat dan bukannya wajib. Jika seseorang meninggalkannya (tidak membacanya), maka tidak berdosa dan solatnya masih dikira sah, tidak kira dia meninggalkannya dengan sengaja mahupun disebabkan terlupa. Akan tetapi dihukumkan sebagai makruh meninggalkannya secara sengaja. Inilah mazhab kami (mazhab Syafi\\'i), Malik, Abu Hanifah dan jumhur ulama. Malah, al-Syeikh Abu Hamid menyatakan, ia merupakan pendapat kebanyakan fuqaha\\'. Begitu juga pengarang al-Hawi juga ada menyebutkan, ia adalah mazhab fuqaha keseluruhannya. (Lihat al-Majmu\\' Syarh al-Muhazzab, 3/414).\\n\\nPenjelasan lanjut berkenaan perkara ini, bolehlah merujuk kepada artikel kami dalam Ahkam Syar\\'iyyah yang bertajuk: \"Bacaan Rukuk dan Sujud; Wajib atau Sunat.\"\\n\\nBerbalik kepada soalan yang diajukan, sebagaimana yang kita ketahui, bacaan tasbih rukuk dan sujud termasuk dalam sunat-sunat hai\\'ah. Mengenai hal ini, al-Bujairimi ada menyatakan bahawa pada sunat-sunat hai\\'ah, seseorang itu tidak perlu untuk sujud sahwi disebabkan oleh dia memindahkan bacaan sunat-sunat hai\\'ah (pada bukan tempatnya) melainkan pada masalah bacaan surah — selain surah al-Fatihah kerana ia adalah rukun. (Lihat Hasyiah al-Bujairimi \\'ala Syarh al-Manhaj, 1/258).\\n\\nBegitu juga Nawawi al-Jawi turut menjelaskan berkenaan hal ini dengan menyebutkan, pada sunat-sunat hai\\'ah, seseorang itu tidak perlu untuk sujud sahwi disebabkan oleh dia memindahkan bacaan sunat-sunat hai\\'ah (pada bukan tempatnya) melainkan pada masalah surah (selain surah al-Fatihah) apabila ia dibaca pada tempat selain qiyam sekalipun tanpa niat untuk melakukannya. (Lihat Nihayah al-Zain, hlm. 84).\\n\\nKesimpulannya\\n\\nSebahagian ulama menganggap keitka rukuk dibaca dengan tasbih dalam bentuk ta\\'zim adalah menggambarkan keagungan dan kebesaran Allah SWT. Hai\\'ah dan keadaan seseorang rukuk sebagai tanda memulia dan mengagungkan Allah SWT atas kerana itulah tidak boleh seseorang merukuk kepada seseorang. \\n\\nBegitu juga, apabila seseorang sujud, maka dia mengucap tasbih dala, bentuk meninggikan Allah SWT. Ini kerana, hai\\'ah dan keadaan sujud itu merupakan di puncak kehinaan hamba kepada Tuhannya yang Maha Tinggi. Dengan sebab dahinya dan wajahnya yang mulia berada sama tinggi dengan kakinya sebagai puncak kehambaan kepada Yang Maha Tinggi.\\n\\nDaripada Abu Hurairah, bahawa Rasulullah SAW bersabda:\\n\\nأقرب ما يكون العبد من ربه وهو ساجد ، فأكثروا الدعاء\\n\\nMaksudnya: \"Keadaan yang paling dekat seseorang hamba dengan Tuhan-nya ialah ketika dia bersujud. Maka perbanyakkanlah berdoa (pada waktu sujud).\"\\n\\nRiwayat Muslim dan al-Nasaie\\n\\nJusteru, sunat seseorang itu berdoa ketika bersujud, seboleh-bolehnya dalam bahasa Arab dan sesudah bertasbih sebagaimana yang dilakukan oleh Rasulullah SAW.\\n\\nOleh itu, berdasarkan kepada kenyataan dan perbincangan di atas, jelaslah bahawa seseorang yang tersilap atau tertukar bacaan tasbih sujud pada rukuk atau sebaliknya, solatnya tidak terbatal dan masih dikira sah kerana kedua-dua bacaan tasbih itu termasuk dalam perkara sunat hai\\'ah. Begitu juga dia tidak perlu untuk melakukan sujud sahwi disebabkan oleh perkara tersebut.\\n\\nSemoga Allah SWT memberikan kefahaman yang jelas kepada kita semua dalam beragama. Amin.\\n\\nWallahu a\\'lam.<|eot_id|><|begin_of_text|><|start_header_id|>system<|end_header_id|>\\n\\nCutting Knowledge Date: December 2023\\nToday Date: 06 Jan 2025\\n\\nYou are going to enter reasoning mode, first you try to think step-by-step in malay after that give the final answer.<|eot_id|><|start_header_id|>user<|end_header_id|>\\n\\nAssalamualaikum YB Ustaz. Untuk badal haji bagi arwah ibu dan ayah saya adakah ianya wajib dibuat oleh waris? Saya ada baca hadis berkenaan terputusnya amalan anak Adam kecuali 3 perkara. Saya keliru di situ badal haji ni wajib buat atau tidak?<|eot_id|><|start_header_id|>assistant<|end_header_id|>\\n\\nWaalaikumusslam  wbt..\\n\\nAlhamdulillah, segala puji bagi Allah SWT, selawat dan salam kepada Junjungan Besar Nabi Muhammad SAW, isteri dan ahli keluarga Baginda, para sahabat Baginda serta orang-orang yang mengikuti jejak langkah Baginda sehingga Hari Kiamat.\\n\\nKami mulakan dengan firman Allah SWT:\\n\\nوَأَتِمُّوا الْحَجَّ وَالْعُمْرَةَ لِلَّـهِ\\n\\nMaksudnya: \"Dan sempurnakanlah Ibadah Haji dan Umrah kerana Allah.\"\\n\\n(Surah al-Baqarah: 196)\\n\\nPara ulama telah bersepakat memutuskan bahawa haji adalah fardhu, tanpa seorang pun di kalangan mereka berpendapat sebaliknya. Oleh itu, mereka menghukumkan kafir kepada sesiapa yang mengingkari sesuatu yang yang telah thabit dengan al-Quran, al-Sunnah dan ijma\\'. Begitu juga, berdasarkan pendapat yang lebih jelas daripada Imam al-Syafi\\'i, umrah juga adalah fardhu sebagaimana haji dan ayat di atas adlah merupakan dalil bagi mereka yang berpendapat bahawa umrah adalah fardhu. Selain itu, mereka juga telah bersepakat mengatakan bahawa haji dan umrah wajib dilakukan oleh mereka yang mampu, hanya sekali seumur hidup. (Lihat al-Fiqh al-Manhaji,2/115-116 dan al-Idhah fi Manasik al-Haj wa al-Umrah, hlm. 378-379.)\\n\\nDefinisi Badal Haji\\n\\nKami nyatakan terlebih dahulu takrif bagi Badal Haji. \\'Badal\\' menurut Dewan Bahasa dan Pustaka Edisi Keempat ialah mewakili bagi pihak orang lain naik haji. Manakala \\'Haji\\' pada sudut bahasa bermaksud tujuan, dan pada istilah fuqaha\\' bermakna menuju ke Baitullah al-Haram untuk menunaikan ibadah yang khusus berserta syarat-syarat yang khusus.(Lihat al-Fiqh al-Manhaji, 2/113)\\n\\nMaka yang dimaksudkan dengan Badal Haji ialah seseorang yang telah melakukan haji untuk dirinya lalu melaksanakan haji untuk orang lain, sama ada seseorang yang telah meninggal dunia atau sakit yang tiada harapan sembuh untuk melakukan ibadah haji ke tanah suci, sama ada dengan upah atau tidak.\\n\\nHukum Mengerjakan Badal Haji\\n\\nMengenai hal ini, Imam al-Nawawi menyebutkan bahawa jumhur ulama berpendapat boleh untuk mewakilkan haji ke atas orang yang telah meninggal dunia dan uzur yang tiada harapan untuk sembuh.( Lihat al-Minhaj Syarh Sahih Muslim, 8/27.)\\n\\nHal ini adalah berdasarkan hadith daripada Ibn Abbas R.Anhuma:\\n\\nأَنَّ امْرَأَةً مِنْ جُهَيْنَةَ جَاءَتْ إِلَى النَّبِيِّ -صَلَّى اللَّهُ عَلَيْهِ وَسَلَّمَ- فَقَالَتْ: إِنَّ أُمِّي نَذَرَتْ أَنْ تَحُجَّ فَلَمْ تَحُجَّ حَتَّى مَاتَتْ، أَفَأَحُجُّ عَنْهَا؟ قَالَ: نَعَمْ حُجِّي عَنْهَا، أَرَأَيْتِ لَوْ كَانَ عَلَى أُم'"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tokenizer.decode(dataset[-3]['input_ids'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "32d65447",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'ِّكِ دَيْنٌ أَكُنْتِ قَاضِيَةً؟ اقْضُوا اللَّهَ، فَاللَّهُ أَحَقُّ بِالْوَفَاءِ\\n\\nMaksudnya: \"Seorang wanita daripada (kabilah) Juhainah datang kepada Nabi SAW lalu berkata: \\'Sesungguhnya ibuku pernah bernazar untuk mengerjakan haji, namun dia belum mengerjakan haji sehinggalah dia wafat. Adakah aku boleh mengerjakan haji sebagai wakilnya?\\' Baginda menjawab: \\'Ya, kerjakanlah haji sebagai wakilnya. Apakah pandanganmu bahawa jika ibumu mempunyai hutang, adakah engkau akan melunaskannya? Tunaikanlah hak Allah, kerana sesungguhnya hak Allah lebih berhak untuk dipenuhi.\\'\"\\n\\nRiwayat al-Bukhari (1852)\\n\\nIbn Hajar al-Haitami menyebut, oleh kerana disamakan haji dengan hutang dan juga adanya tuntutan untuk melunaskannya, maka ia menunjukkan kewajipan mengerjakan haji bagi pihak si mati, dan perbelanjaannya diambil daripada harta si mati. Beliau menambah lagi, sekiranya si mati tidak meninggalkan harta pusaka, maka gugur kewajipan haji ke atasnya begitu juga tidak wajib seseorang waris mengerjakan haji bagi pihaknya. Akan tetapi disunatkan bagi para waris mahupun orang asing untuk mengerjakan haji bagi pihak si mati sekalipun ahli waris tidak mengizinkannya.(Lihat Tuhfat al-Muhtaj fi Syarh al-Minhaj,4/28-29.)\\n\\nBegitu juga dalam riwayat lain daripada Ibn Abbas R.Anhuma, beliau berkata:\\n\\nكَانَ الفَضْلُ رَدِيفَ رَسُولِ اللَّهِ صَلَّى اللهُ عَلَيْهِ وَسَلَّمَ، فَجَاءَتِ امْرَأَةٌ مِنْ خَشْعَمَ، فَجَعَلَ الفَضْلُ يَنْظُرُ إِلَيْهَا وَتَنْظُرُ إِلَيْهِ، وَجَعَلَ النَّبِيُّ صَلَّى اللهُ عَلَيْهِ وَسَلَّمَ، يَصْرِفُ وَجْهَ الفَضْلِ إِلَى الشِّقِّ الآخَرِ، فَقَالَتْ: يَا رَسُولَ اللَّهِ إِنَّ فَرِيضَةَ اللَّهِ عَلَى عِبَادِهِ فِي الحَجِّ أَدْرَكَتْ أَبِي شَيْخًا كَبِيرًا، لاَ يَثْبُتُ عَلَى الرَّاحِلَةِ، أَفَأَحُجُّ عَنْهُ؟ قَالَ: «نَعَمْ»، وَذَلِكَ فِي حَجَّةِ الوَدَاعِ\\n\\nMaksudnya: \"Al-Fadhl membonceng tunggangan Rasulullah SAW, lalu datang seorang wanita daripada suku Khath\\'am, lalu al-Fadhl melihat ke arah wanita tersebut, dan wanita itu melihat ke arahnya. Nabi SAW memalingkan wajah al-Fadhl ke sisi (arah) lain. Lalu wanita itu berkata: \\'Wahai Rasulullah, sesungguhnya Allah mewajibkan ke atas para hamba-Nya untuk menunaikan haji. Aku mendapati bapaku seorang yang sudah tua, sehingga tidak mampu untuk menunggang haiwan tunggangan. Adakah aku boleh melaksanakan haji untuknya?\\' Baginda bersabda: \\'Ya (boleh).\\' Demikian (perkara ini) berlaku ketika Baginda melaksanakan haji wada\\'.\"\\n\\nRiwayat al-Bukhari (1513)\\n\\nHadith di atas mengandungi penjelasan bahawa diharuskan untuk melakukan badal haji bagi seseorang yang telah meninggal dunia. Inilah pendapat para ulama dalam kalangan sahabat Nabi SAW dan selain mereka seperti al-Thauri, Ibn al-Mubarak, al-Syafi\\'i, Ahmad dan Ishaq. Selain itu, ia juga menunjukkan bahawa terdapat kelonggaran untuk menunaikan fardhu haji bagi orang yang masih hidup tetapi telah tua dan tidak mampu lagi untuk menunaikan fardhu haji dengan sendiri. Ini merupakan pendapat Ibn al-Mubarak dan al-Syafi\\'i.(Lihat Fiqh al-Sunnah, 1/637).\\n\\nDr. Wahbah al-Zuhaili di dalam kitabnya menyatakan bahawa dibolehkan bagi seseorang itu untuk melakukan ibadah haji ke atas orang lain dalam dua keadaan:\\n\\nBegitu juga harus menunaikan haji ke atas orang lain sama ada yang telah meninggal dunia ataupun yang uzur berpanjangan pada haji sunat.(Lihat al-Fiqh al-Islami wa Adillatuhu, 3/2098)\\n\\nKembali kepada persoalan di atas, dinukilkan di dalam kitab al-Fiqh al-Manhaji, di bawah tajuk sesiapa yang meninggal dunia dalam keadaan tidak mengerjakan kewajipan haji. Pengarang menyebut: Sekiranya telah diwajibkan haji atau umrah ke atas seseorang, tetapi dia menangguhkannya atau melengah-lengahkannya, dan tidak mengerjakan kedua-duanya sehinggalah dia meninggal dunia, maka dia meninggal dalam keadaan berdosa, maka diwajibkan agar ditentukan seseorang bagi mengerjakan haji atau umrah bagi pihaknya, dengan tanggungan harta si mati, dan kewajipan ini dikira sebagai hutang. Oleh yang demikian, harta peninggalan si mati tidak boleh dibahagikan dan difaraidkan melainkan selepas selesai melunaskan hutang-hutang tersebut. (Rujuk al-Fiqh al-Manhaji \\'ala Mazhab al-Imam al-Syafie, 2/176-177)\\n\\nIsu ini juga telah kami bahaskan pada artikel  #1514: Badal Haji atau Infaq untuk Arwah Datuk Lebih Utama?.Tuan/puan boleh lah merujuk perbahasan tersebut pada link yang kami sertakan di bawah.[1]\\n\\nKesimpulan\\n\\nSetelah meneliti pandangan para ulama kami berpandangan,hendaklah ke atas waris melakukan badalkan haji untuk kedua dua ibu-bapa yang telah meninggal dunia yang belum sempat melakukan ibadah haji dengan menggunakan harta peninggalan mereka kerana ia merupakan beban hutang ke atas si mati. Ini kerana Baginda SAW menyebut bahawa haji merupakan hak Allah SWT, maka ia lebih utama untuk ditunaikan. Yang demikian menunjukkan betapa hutang Allah seperti haji hendaklah dilaksanakan oleh waris.\\n\\nSemoga Allah SWT memberikan kefahaman yang jelas kepada kita semua dalam beragama. Ameen.\\n\\nWallahua\\'lam.\\n\\n[1] https://maktabahalbakri.com/1524-badal-haji-atau-infaq-untuk-arwah-datuk-lebih-utama/<|eot_id|><|begin_of_text|><|start_header_id|>system<|end_header_id|>\\n\\nCutting Knowledge Date: December 2023\\nToday Date: 06 Jan 2025\\n\\nYou are going to enter reasoning mode, first you try to think step-by-step in malay after that give the final answer.<|eot_id|><|start_header_id|>user<|end_header_id|>\\n\\nSaya ada asingkan duit persendirian pada waktu subuh atau lepas subuh dengan niat bersedekah. Saya buka tabung tu sebab suami kerja luar kawasan berbulan-bulan. Jadi saya selalu tak dapat ke surau. Harapan saya, bila suami balik, dia boleh pergi surau dan masukkan dalam tabung surau. Cuma terkadang, bila dalam keadaan “sesak”, saya tak berani buka dan pakai duit tabung sedekah itu sebab bimbang “pecah amanah”. Sebab saya rasakan tabung tu adalah amanah Allah. Adakah betul apa yg saya buat?<|eot_id|><|start_header_id|>assistant<|end_header_id|>\\n\\nWaalaikumusslam  wbt..\\n\\nAlhamdulillah, segala puji bagi Allah SWT, selawat dan salam kepada Junjungan Besar Nabi Muhammad SAW, isteri dan ahli keluarga Baginda, para sahabat Baginda serta orang-orang yang mengikuti jejak langkah Baginda sehingga Hari Kiamat.\\n\\nPengertian Sedekah\\n\\nAmalan sedekah adalah termasuk dalam amalan kebajikan yang digalakkan dalam Islam. Sedekah itu bermaksud pemberian hak milik ketika hidup tanpa mengharapkan pembalasan bertujuan mendekatkan diri kepada Allah SWT.( Lihat al-Majmu\\' syarah al-Muhazzab, 15/370 dan al-Mausu\\'ah al-Fiqhiyyah,26/323).\\n\\nIbn Manzur pula mendefinisikan sedekah sebagai satu pemberian yang diniatkan kerana Allah SWT kepada golongan fakir yang memerlukan.(Lihat Lisan al-Arab, 10/196)\\n\\nBersedekah merupakan antara amal soleh yang amat besar fadhilat dan ganjaran yang diberikan kepada pelakunya. Firman Allah SWT:\\n\\nمَّثَلُ الَّذِينَ يُنفِقُونَ أَمْوَالَهُمْ فِي سَبِيلِ اللَّهِ كَمَثَلِ حَبَّةٍ أَنبَتَتْ سَبْعَ سَنَابِلَ فِي كُلِّ سُنبُلَةٍ مِّائَةُ حَبَّةٍ ۗ وَاللَّهُ يُضَاعِفُ لِمَن يَشَاءُ ۗ وَاللَّهُ وَاسِعٌ عَلِيمٌ\\n\\nMaksudnya: Perumpamaan golongan yang membelanjakan harta mereka di jalan Allah adalah seperti satu biji benih yang menumbuhkan tujuh batang tangkai. Dan di setiap satu batang tangkai itu terdapatnya seratus biji benih. Allah melipat gandakan (ganjaran) bagi sesiapa yang Dia kehendaki dan Allah itu Maha Memberi Keluasan lagi Maha Mengetahui.\\n\\n(Surah al-Baqarah: 261) \\n\\nAntara perkara yang paling besar faedahnya bagi orang-orang yang beriman ialah bersedekah di jalan Allah. Perumpamaan orang-orang yang bersedekah dengan harta mereka di jalan Allah ialah seperti sebiji benih yang menumbuh di tanah yang baik, maka benih itu pun tumbuh dengan kukuh dan mengeluarkan tujuh tangkai, dan setiap tangkai mempunyai seratus biji. Allah melipatgandakan pahala bagi sesiapa yang dikehendaki-Nya; dan Allah Maha Luas Rahmat-Nya, lagi Maha Mengetahui siapa yang berhak menerimanya, serta Maha Mengetahui niat-niat hamba-hamba-Nya.\"(Lihat Tafsir al-Muyassar,1/44)\\n\\nIni merupakan suatu dalil yang jelas menunjukkan betapa besarnya pahala sedekah yang boleh menghasilkan 700 kali ganda kebaikan kepada pelakunya. Ayat ini umum meliputi sebarang bentuk sedekah sama ada ia datang dalam bentuk harta benda, makanan dan minuman, pakaian, dan seumpamanya.\\n\\nBersedekah merupakan amalan yang mulia. Tangan yang di atas lebih mulia. Daripada Hakim bin Hizam R.A bahawa Nabi SAW bersabda:\\n\\nالْيَدُ الْعُلْيَا خَيْرٌ مِنْ الْيَدِ السُّفْلَى وَابْدَأْ بِمَنْ تَعُولُ وَخَيْرُ الصَّدَقَةِ عَنْ ظَهْرِ غِنًى وَمَنْ يَسْتَعْفِفْ يُعِفَّهُ اللَّهُ وَمَنْ يَسْتَغْنِ يُغْنِهِ اللَّهُ\\n\\nMaksudnya: Tangan yang di atas lebih baik daripada tangan yang di bawah dan mulakanlah dengan kaum keluargamu. Sebaik-sebaik sedekah adalah dalam keadaan kaya. Sesiapa yang menjaga kehormatan dirinya maka Allah akan menjaganya dan barangsiapa yang merasa cukup maka Allah akan memberikan kecukupan kepadanya.\"\\n\\nRiwayat al-Bukhari (1427)\\n\\nAl-Mubarakfuri berkata: Tangan yang di atas adalah tangan yang memberi atau berinfaq. Sedangkan tangan yang dibawah ialah yang meminta. (Lihat'"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tokenizer.decode(dataset[-2]['input_ids'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "6995800a",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "RepoUrl('https://huggingface.co/datasets/huseinzol05/llama3.2-reasoning-multipack-3k', endpoint='https://huggingface.co', repo_type='dataset', repo_id='huseinzol05/llama3.2-reasoning-multipack-3k')"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from huggingface_hub import create_repo, delete_repo\n",
    "\n",
    "try:\n",
    "    delete_repo(repo_id=\"huseinzol05/llama3.2-reasoning-multipack-3k\", repo_type=\"dataset\")\n",
    "except:\n",
    "    pass\n",
    "create_repo(\"huseinzol05/llama3.2-reasoning-multipack-3k\", repo_type=\"dataset\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "1112f4f2",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "633c452aa0134c6b9688c431b3acea01",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "shard.00000.mds:   0%|          | 0.00/67.1M [00:00<?, ?B/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "f941de999719488784b33a94ba52cd91",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "shard.00001.mds:   0%|          | 0.00/67.1M [00:00<?, ?B/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "6d2d363fb95c436e95fb03dd6d110d4d",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Upload 23 LFS files:   0%|          | 0/23 [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "ae6d3bea6fb9418dbdbe8543b05da842",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "shard.00003.mds:   0%|          | 0.00/67.1M [00:00<?, ?B/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "2b47aebbb5de4ed1a620740cf0c74b6c",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "shard.00002.mds:   0%|          | 0.00/67.1M [00:00<?, ?B/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "f9bbadd19c6b43d691d81b921d8c42a4",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "shard.00004.mds:   0%|          | 0.00/67.1M [00:00<?, ?B/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "a5b8de96f4f1412d88a0822fb71d8660",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "shard.00005.mds:   0%|          | 0.00/67.1M [00:00<?, ?B/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "cd6becc934d3491ca5e9d31ae8ca898d",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "shard.00006.mds:   0%|          | 0.00/67.1M [00:00<?, ?B/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "70f2612ec6964b63ac99df86537d2c23",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "shard.00007.mds:   0%|          | 0.00/67.1M [00:00<?, ?B/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "fd4b75c8e862479abd4ee83a818a328b",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "shard.00008.mds:   0%|          | 0.00/67.1M [00:00<?, ?B/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "642d254345c94626b32c603492b9ced0",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "shard.00009.mds:   0%|          | 0.00/67.1M [00:00<?, ?B/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "52d71dc2a61b49af957cac10a5cde566",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "shard.00010.mds:   0%|          | 0.00/67.1M [00:00<?, ?B/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "af3b116a06fc4a959c41ddc8401563fc",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "shard.00011.mds:   0%|          | 0.00/67.1M [00:00<?, ?B/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "42486220ac014def8cdd8f40168b9da1",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "shard.00012.mds:   0%|          | 0.00/67.1M [00:00<?, ?B/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "e0ee07dfff5e4d4281ea146f1713f770",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "shard.00013.mds:   0%|          | 0.00/67.1M [00:00<?, ?B/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "a8a0222e660f4bca92a35fc35adef022",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "shard.00014.mds:   0%|          | 0.00/67.1M [00:00<?, ?B/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "c6e9081ed56a4b16aad2a3168f788eee",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "shard.00015.mds:   0%|          | 0.00/67.1M [00:00<?, ?B/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "54504d7d50084f8982022f2328284da3",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "shard.00016.mds:   0%|          | 0.00/67.1M [00:00<?, ?B/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "b97fbc24593a47f5841a286de1ffc82e",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "shard.00017.mds:   0%|          | 0.00/67.1M [00:00<?, ?B/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "24a31f2ceaac4d5ab1ca8afd50cdf935",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "shard.00018.mds:   0%|          | 0.00/67.1M [00:00<?, ?B/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "117c1523c30b42c3ba00838b01f66e2c",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "shard.00019.mds:   0%|          | 0.00/67.1M [00:00<?, ?B/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "f64a5afc8ae34aeab79089d9a09bd09b",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "shard.00020.mds:   0%|          | 0.00/67.1M [00:00<?, ?B/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "54a42b01a4ac48b9ab23ed7594eb3f5b",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "shard.00021.mds:   0%|          | 0.00/67.1M [00:00<?, ?B/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "ba0fc7a5d8304442abd5b238db4156fa",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "shard.00022.mds:   0%|          | 0.00/3.74M [00:00<?, ?B/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "CommitInfo(commit_url='https://huggingface.co/datasets/huseinzol05/llama3.2-reasoning-multipack-3k/commit/87dc8a51f22437cf409d045415e618c162e798f3', commit_message='Upload folder using huggingface_hub', commit_description='', oid='87dc8a51f22437cf409d045415e618c162e798f3', pr_url=None, repo_url=RepoUrl('https://huggingface.co/datasets/huseinzol05/llama3.2-reasoning-multipack-3k', endpoint='https://huggingface.co', repo_type='dataset', repo_id='huseinzol05/llama3.2-reasoning-multipack-3k'), pr_revision=None, pr_num=None)"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from huggingface_hub import HfApi\n",
    "api = HfApi()\n",
    "\n",
    "api.upload_folder(\n",
    "    folder_path=\"packing-4k-reasoning\",\n",
    "    repo_id=\"huseinzol05/llama3.2-reasoning-multipack-3k\",\n",
    "    repo_type=\"dataset\",\n",
    ")"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "python3.10",
   "language": "python",
   "name": "python3.10"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.15"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
